﻿/*
 * Создан: Оникийчук Антон Игоревич
 * Компания: ООО "ИМСАТ"
 * Дата создания: 02.02.2009
 * Время создания: 15:56
 * Emal разработчика: onikiychuka@gmail.com
 */
using System.Collections.Generic;
using System.Xml;

namespace IMSAT.OFTD.DOM
{
    public class XmlNodeAttribute
    {
        private readonly string _name = "";

        private readonly XmlNamespace _nspc;

        private readonly string _value = "";

        public XmlNodeAttribute(string name, XmlNamespace ns, string value1)
        {
            _name = name;
            _nspc = ns;
            _value = value1;
        }

        public string Name
        {
            get { return _name; }
        }

        public XmlNamespace Nspc
        {
            get { return _nspc; }
        }

        public string Value
        {
            get { return _value; }
        }
    }

    /// <summary>
    /// Класс для чтения XML узла
    /// </summary>
    public class OFTDXmlNodeReader
    {
        #region Delegates

        public delegate void CustomNodeReadEndDelegate(OFTDXmlNodeReader reader);

        public delegate void CustomXmlReadDelegate(XmlReader reader);

        public delegate void OnChildReadDelegate(OFTDXmlNodeReader nodeReader);

        public delegate void ReadEndDlegate(OFTDXmlNodeReader reader);

        #endregion

        private readonly List<XmlNodeAttribute> _attributes = new List<XmlNodeAttribute>();
        private readonly XmlReader _reader;

        private string _nodeName = "";
        private XmlNamespace _nodeNamespace;

        public OFTDXmlNodeReader(XmlReader rd1)
        {
            _reader = rd1.ReadSubtree();
            ChildRead += delegate { };
            CustomNodeReadEnd += delegate { };
            ReadEnd += delegate { };
            CustomXmlRead += delegate(XmlReader rd)
                                 {
                                     _nodeName = rd.LocalName;
                                     _nodeNamespace = new XmlNamespace(rd.NamespaceURI, rd.Prefix);
                                     int cnt = rd.AttributeCount;
                                     for (int i = 0; i < cnt; i++)
                                     {
                                         rd.MoveToAttribute(i);
                                         var att = new XmlNodeAttribute(rd.LocalName,
                                                                        new XmlNamespace(rd.NamespaceURI, rd.Prefix),
                                                                        rd.Value);
                                         _attributes.Add(att);
                                         rd.MoveToElement();
                                     }
                                 };
        }

        public XmlNamespace NodeNamespace
        {
            get { return _nodeNamespace; }
        }

        public List<XmlNodeAttribute> Attributes
        {
            get { return _attributes; }
        }

        /// <summary>
        /// Евент срабатывающий при чтение дочернего xmlNode
        /// </summary>
        public event OnChildReadDelegate ChildRead;

        public event CustomXmlReadDelegate CustomXmlRead;

        public event ReadEndDlegate ReadEnd;

        public event CustomNodeReadEndDelegate CustomNodeReadEnd;

        public void Read()
        {
            bool readroot = true;
            while (_reader.Read())
            {
                if (_reader.NodeType == XmlNodeType.Element)
                {
                    if (readroot)
                    {
                        CustomXmlRead(_reader);
                        CustomNodeReadEnd(this);
                        readroot = false;
                    }
                    else
                    {
                        ChildRead(new OFTDXmlNodeReader(_reader));
                    }
                }
            }
            ReadEnd(this);
        }
    }
}